package com.unionpay.fsas.encrypt.encoder.api;

import com.unionpay.fsas.encrypt.encoder.connect.UnionComm;
import com.unionpay.fsas.encrypt.encoder.connect.UnionStart;
import com.unionpay.fsas.encrypt.encoder.message.UnionMessage;
import com.unionpay.fsas.encrypt.encoder.message.UnionRequest;
import com.unionpay.fsas.encrypt.encoder.utils.UnionVerify;

public class UnionEssc {

	/**
	 * 开始初始化
	 */
	private static UnionStart api = null;

	public UnionEssc (UnionStart unionStrart) {
		UnionEssc.api = unionStrart;
	}


	/**
	 * E119 启用、挂起对称密钥
	 * @param keyName 	密钥名称
	 * @param mode 			模式  1：启用密钥  2：挂起密钥
	 * @return
	 * 					返回 {@link UnionMessage} 对象，获取数据方法在该对象注释中已经说明。
	 */
	public UnionMessage servE119(String keyName, int mode ){
	    if(UnionVerify.paramIsEmpty(keyName)) {
	    	return UnionVerify.paramValueWrong("keyName");
		}
		if(mode<0||mode>2) {
			return UnionVerify.paramValueWrong("mode");
		}
		UnionMessage um = new UnionRequest();
		um.putHeadField("serviceCode", "E119");
		um.putBodyField("keyName", keyName);
		um.putBodyField("mode", mode);
		return UnionComm.sendAndRecvMsg(um,  api.getMaxSendTimes());
	}

	/**
	 * E150 生成MAC		//2017.06.09 linxl 根据文档添加了参数keyVersion
	 * @param keyVersion			密钥版本
	 * @param mode					模式
	 * @param keyName			密钥名称
	 * @param keyValue				密钥密文
	 * @param algorithmID		算法标识
	 * @param fillMode				自动填充方式
	 * @param dataType			数据类型
	 * @param data					数据
	 * @return
	 * 					返回 {@link UnionMessage} 对象，获取数据方法在该对象注释中已经说明。
	 * 					获取响应信息：
	 * 				 	{@code string = mac} 	：MAC
	 */
	public UnionMessage servE150(String keyVersion, String mode, String keyName, String keyValue, String algorithmID,
                                 String fillMode, String dataType, String data){

		if(UnionVerify.paramIsEmpty(data)) {
	    	return UnionVerify.paramValueWrong("data");
	    }

		//组装服务代码
		UnionMessage um = new UnionRequest();
		um.putHeadField("serviceCode", "E150");

		//组装报文体
		um.putBodyField("data", data);

		//判断可选
		if(!UnionVerify.paramIsEmpty(keyVersion)) {
			um.putBodyField("keyVersion", keyVersion);
		}
		if(!UnionVerify.paramIsEmpty(mode)) {
			um.putBodyField("mode", mode);
		}
		if(!UnionVerify.paramIsEmpty(keyName)) {
			um.putBodyField("keyName", keyName);
		}
		if(!UnionVerify.paramIsEmpty(keyValue)) {
			um.putBodyField("keyValue", keyValue);
		}
		if(!UnionVerify.paramIsEmpty(algorithmID)) {
			um.putBodyField("algorithmID", algorithmID);
		}
		if(!UnionVerify.paramIsEmpty(fillMode)) {
			um.putBodyField("fillMode", fillMode);
		}
		if(!UnionVerify.paramIsEmpty(dataType)) {
			um.putBodyField("dataType", dataType);
		}

		return UnionComm.sendAndRecvMsg(um, api.getMaxSendTimes());
	}


}

